/**
 * 遍历项类型
 */
export type ItemType<T> = T extends Array<infer U>
    ? U
    : T extends object ? T[keyof T] : any;

/**
* 遍历 key 类型
*/
export type KeyType<T> = T extends Array<any>
    ? number
    : T extends object ? keyof T : any;

// 传入参数
export type ParamsType<T> = T extends Array<object> ? keyof T[number] : never;

// 传入函数
export type FunctionType<T> = (item: ItemType<T>, index: KeyType<T>) => any

/**
 *  Option 配置数据的属性类型  
 */
export type OptionAttribute<T> = ParamsType<T> | (FunctionType<T>)

/**
 * 归一化前处理函数类型
 * @param T 遍历数据类型
 */
export type FuncType<T> = <RT>(item: ItemType<T>, key: KeyType<T>) => RT

export interface MySelectType<T> {
    /** option 选项 */
    options: T
    /** 选项的标签, 默认为遍历属性key */
    label?: OptionAttribute<T>
    /** 选项的值, 默认为当前遍历项 */
    value?: OptionAttribute<T>
    /** 自定义渲染项, 默认为全部渲染 */
    render?: OptionAttribute<T>
    /** 是否禁用, 默认为不禁用 */
    disabled?: OptionAttribute<T> | boolean
}